# 类是特殊的对象，加载到内存仅有一份，也可以为类定义属性/方法
class Tools(object):
    # 定义类属性,记录与类相关的特征
    count = 0

    def __init__(self, name) -> None:
        self.name = name
        # 访问类属性
        Tools.count += 1

    # 定义类方法，第一个参数必须为cls
    @classmethod
    def class_method(cls):
        print("工具的数量为%d个" % cls.count)

    # 如果要访问实例属性定义实例方法(第一个参数为self)，要访问类属性定义类方法(第一个参数为cls)
    # 如果不访问实例/类属性则定义静态方法
    @staticmethod
    def static_method():
        print("我是静态方法")


tool1 = Tools("斧头")
tool2 = Tools("钳子")
# 访问类属性
print(Tools.count)

# 属性获取机制
# 类名.属性 对象.属性，先从对象查如果没有往上找直到查找到类属性
# 使用对象访问类属性(不推荐)
print(tool1.count)
# 使用对象为类属性赋值,直接在tool1对象查找count属性，如果没有则在tools1对象中添加count属性并赋值
# 此时并不会修改类属性的值，读取类属性不会出问题
tool1.count = 100
print(tool1.count)
print(Tools.count)

# 使用类方法(cls参数由python解释器直接传入)
Tools.class_method()

# 调用静态方法
Tools.static_method()


# 综合演练
class Game:
    # 定义类属性记录历史最高分
    top_score = 0

    # 定义静态方法查看游戏帮助
    @staticmethod
    def help():
        print("我是游戏帮助，有问题找我")

    # 定义类方法查看历史最高分
    @classmethod
    def show_top_score(cls):
        print("历史最高分为%d" % cls.top_score)

    # 在__init__中定义实例属性玩家姓名
    def __init__(self, player_name):
        self.player_name = player_name

    # 实例方法开始游戏
    def start_game(self):
        print("%s开始游戏...." % self.player_name)


# 查看游戏帮助
Game.help()
# 查看历史最高分
Game.show_top_score()
# 玩游戏
game = Game("小明")
game.start_game()
